package com.money.tracker.common.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Pattern;

/**
 * 密码验证器实用程序
 *
 * @author zhangshuai
 * @date 2024/11/08
 */
public class PasswordValidatorUtil {

    // 正则表达式
    private static final Pattern DIGIT_PATTERN = Pattern.compile("[0-9]");
    private static final Pattern LOWER_CASE_PATTERN = Pattern.compile("[a-z]");
    private static final Pattern UPPER_CASE_PATTERN = Pattern.compile("[A-Z]");
    private static final Pattern SPECIAL_CHAR_PATTERN = Pattern.compile("[!@#$%^&*()_+\\-=\\[\\]{};':\",.<>?]");

    /**
     * 校验密码是否包含数字、大小写字母、特殊字符中的两个或两个以上
     *
     * @param password 待校验的密码
     * @return 如果密码符合要求，返回true；否则返回false
     */
    public static boolean validatePassword(String password) {
        if (StringUtils.isBlank(password)){
            return false;
        }

        int count = 0;

        if (DIGIT_PATTERN.matcher(password).find()) {
            count++;
        }
        if (LOWER_CASE_PATTERN.matcher(password).find()) {
            count++;
        }
        if (UPPER_CASE_PATTERN.matcher(password).find()) {
            count++;
        }
        if (SPECIAL_CHAR_PATTERN.matcher(password).find()) {
            count++;
        }

        return count >= 2;
    }

    public static void main(String[] args) {
        // 测试用例
        String[] passwords = {
            "Password123",  // 数字和大写字母
            "password!",    // 小写字母和特殊字符
            "PASSWORD!",    // 大写字母和特殊字符
            "123456!",      // 数字和特殊字符
            "password123",  // 小写字母和数字
            "12345678",     // 只有数字
            "password",     // 只有小写字母
            "PASSWORD",     // 只有大写字母
            "!!!!!!!"       // 只有特殊字符
        };

        for (String password : passwords) {
            System.out.println("Password: " + password + " - Valid: " + validatePassword(password));
        }
    }
}
